#ifndef __RADAR_PROTOCOL_SSTK_H__
#define __RADAR_PROTOCOL_SSTK_H__

#include <stdint.h>
#include <stdbool.h>
#include "common.h"
#include "config.h"

#define FRAM_HEAD 0xABCD
#define JB_HEAD   0x4A42
#define MB_HEAD   0x4D42
#define DL_HEAD   0x444C
#define LL_HEAD   0x4C4C

#define SSTK_EVENT_STATIC_QUEUE_SIZE 30

#define PARKING_EVENT_CODE    0x01
#define PEDESTRIAN_EVENT_CODE 0x21

typedef struct __attribute__((packed)) {
    uint16_t type;
    uint16_t length;  // 包长度
} sstk_header_t;

typedef struct __attribute__((packed)) {
    uint8_t data_status;          // 数据状态
    uint8_t time_stamp[7];        // 时间戳
    uint8_t obj_num;              // 目标数量
    uint8_t obj_data_length;      // 目标数据长度
    uint8_t lane_count;           // 车道数量
    uint8_t lane_data_length;     // 车道数据长度
    uint8_t has_ll;               // 是否有流量数据
    uint8_t ll_data_length;       // 流量数据长度
    uint16_t ll_report_interval;  // 流量数据上报间隔
    uint8_t traffic_conditions;   // 交通状况
    uint8_t has_event;            // 是否有事件数据
    uint16_t protocol_version;    // 协议版本
    uint8_t system_status;        // 系统状态
} sstk_jb_t;

typedef struct __attribute__((packed)) {
    uint8_t id;
    int16_t dist_y;   // 距离Y轴位置
    int16_t dist_x;   // 距离X轴位置
    int16_t speed_y;  // Y轴速度
    uint8_t type;
    uint8_t lane_id;            // 车道ID
    uint16_t headway_distance;  // 头部距离
    uint16_t time_headway;      // 头部时间
    int16_t speed_x;            // X轴速度
    uint16_t degree;            // 角度
    uint8_t event;              // 事件标志
    int32_t radar_x;            // 雷达X坐标
    int32_t radar_y;            // 雷达Y坐标
    uint8_t blind_spot_tag;     // 补盲标记
    uint8_t length;             // 目标长度
    uint8_t width;              // 目标宽度
    double longitude;           // 经度
    double latitude;            // 纬度
    int32_t event_extra;        // 事件额外信息
} sstk_obj_t;

typedef struct __attribute__((packed)) {
    sstk_obj_t obj[0];  // 目标数据
} sstk_mb_t;

typedef struct __attribute__((packed)) {
    uint8_t lane_id;                 // 车道ID
    uint16_t queue_length;           // 队列长度
    uint8_t queue_congestion_level;  // 队列拥堵等级
    uint8_t overflow_tag;            // 溢出标记
} sstk_lane_t;

typedef struct __attribute__((packed)) {
    sstk_lane_t lane[0];  // 车道数据
} sstk_dl_t;

typedef struct __attribute__((packed)) {
    uint8_t lane_id;                           // 车道ID
    uint16_t large_vehicle_count;              // 大型车辆数量
    uint16_t large_vehicle_average_speed;      // 大型车辆平均速度
    uint16_t medium_vehicle_count;             // 中型车辆数量
    uint16_t medium_vehicle_average_speed;     // 中型车辆平均速度
    uint16_t small_vehicle_count;              // 小型车辆数量
    uint16_t small_vehicle_average_speed;      // 小型车辆平均速度
    uint16_t non_motor_vehicle_count;          // 非机动车数量
    uint16_t non_motor_vehicle_average_speed;  // 非机动车平均速度
    uint16_t average_vehicle_speed;            // 平均车辆速度
    uint16_t lane_occupancy;                   // 车道占有率
    uint16_t time_occupancy;                   // 车道占有时间
    uint16_t average_time_headway;             // 平均时间间隔
    uint16_t average_vehicle_spacing;          // 平均车辆间距
} sstk_ll_data_t;

typedef struct __attribute__((packed)) {
    sstk_ll_data_t ll_data[0];  // 流量数据
} sstk_ll_t;

typedef struct {
    sstk_obj_t obj_info;        // 目标信息
    int32_t event;              // 事件标志
    int64_t first_report_time;  // 更新时间
    int32_t duration;           // 持续时间
    int64_t last_report_time;   // 上次上报时间
} sstk_event_static_t;

void analysis_radar_buffer_sstk(char *buffer, int length, uint8_t dev_type);
bool update_event_queue_sstk(sstk_obj_t *obj, uint32_t event_id);
#endif  // !__RADAR_PROTOCOL_SSTK_H__